package br.com.equus.entidade;

import static javax.persistence.GenerationType.IDENTITY;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import org.hibernate.envers.Audited;

import br.com.arquitetura.entidade.Entidade;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.StringUtil;

@Entity
@Table(name = "EQ_PROPRIETARIO", catalog = "EQUUS")
@Audited
public class Proprietario extends Entidade<Integer> {

	private static final long serialVersionUID = 809064116949119615L;

	@Id
	@Column(name = "ID_PROPRIETARIO", unique = true, nullable = false)
	@GeneratedValue(strategy = IDENTITY)
	private Integer id;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_TP_PROPRIETARIO", referencedColumnName = "ID_TP_PROPRIETARIO")
	private TipoProprietario tipoProprietario;

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "ID_MUNICIPIO", referencedColumnName = "ID_MUNICIPIO")
	private Municipio municipio;

	@Column(name = "NOM_PROPRIETARIO", nullable = false)
	private String nome;

	@Column(name = "CPF", nullable = false, length = 11, unique = true)
	private String cpf;

	@Column(name = "LOGRAUDOURO", nullable = false, length = 250)
	private String lograudouro;

	@Column(name = "TEL_CELULAR", length = 50)
	private String telefoneCelular;

	@Column(name = "TEL_COMERCIAL", length = 50)
	private String telefoneComercial;

	@Column(name = "TEL_RESIDENCIAL", length = 50)
	private String telefoneResidencial;

	@Column(name = "NUM_RG", length = 50)
	private String rg;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_NASCIMENTO", nullable = false)
	private Date dtnascimento;

	@Transient
	private String telefoneCelularFormat;

	@Transient
	private String telefoneComercialFormat;

	@Transient
	private String telefoneResidencialFormat;

	@Transient
	private String cpfFormat;

	@Transient
	private String dtnascimentoFormat;

	public Proprietario() {
	}

	public Proprietario(Integer id) {
		this.id = id;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public TipoProprietario getTipoProprietario() {
		return tipoProprietario;
	}

	public void setTipoProprietario(TipoProprietario tipoProprietario) {
		this.tipoProprietario = tipoProprietario;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getLograudouro() {
		return lograudouro;
	}

	public void setLograudouro(String lograudouro) {
		this.lograudouro = lograudouro;
	}

	public String getTelefoneCelular() {
		return telefoneCelular;
	}

	public void setTelefoneCelular(String telefoneCelular) {
		this.telefoneCelular = telefoneCelular;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cpf == null) ? 0 : cpf.hashCode());
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((lograudouro == null) ? 0 : lograudouro.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		result = prime * result + ((rg == null) ? 0 : rg.hashCode());
		result = prime * result + ((telefoneCelular == null) ? 0 : telefoneCelular.hashCode());
		result = prime * result + ((telefoneComercial == null) ? 0 : telefoneComercial.hashCode());
		result = prime * result + ((telefoneResidencial == null) ? 0 : telefoneResidencial.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Proprietario other = (Proprietario) obj;
		if (cpf == null) {
			if (other.cpf != null)
				return false;
		} else if (!cpf.equals(other.cpf))
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (lograudouro == null) {
			if (other.lograudouro != null)
				return false;
		} else if (!lograudouro.equals(other.lograudouro))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		if (rg == null) {
			if (other.rg != null)
				return false;
		} else if (!rg.equals(other.rg))
			return false;
		if (telefoneCelular == null) {
			if (other.telefoneCelular != null)
				return false;
		} else if (!telefoneCelular.equals(other.telefoneCelular))
			return false;
		if (telefoneComercial == null) {
			if (other.telefoneComercial != null)
				return false;
		} else if (!telefoneComercial.equals(other.telefoneComercial))
			return false;
		if (telefoneResidencial == null) {
			if (other.telefoneResidencial != null)
				return false;
		} else if (!telefoneResidencial.equals(other.telefoneResidencial))
			return false;
		return true;
	}

	public String getTelefoneCelularFormat() {
		if (telefoneCelular != null && !telefoneCelular.equals("")) {
			return StringUtil.format("(##)####-####", telefoneCelular);
		}
		return telefoneCelularFormat;
	}

	public void setTelefoneCelularFormat(String telefoneCelularFormat) {
		this.telefoneCelularFormat = telefoneCelularFormat;
	}

	public String getCpfFormat() {
		if (cpf != null) {
			return StringUtil.format("###.###.###-##", cpf);
		}
		return cpfFormat;
	}

	public void setCpfFormat(String cpfFormat) {
		this.cpfFormat = cpfFormat;
	}

	public String getTelefoneComercial() {
		return telefoneComercial;
	}

	public void setTelefoneComercial(String telefoneComercial) {
		this.telefoneComercial = telefoneComercial;
	}

	public String getTelefoneResidencial() {
		return telefoneResidencial;
	}

	public void setTelefoneResidencial(String telefoneResidencial) {
		this.telefoneResidencial = telefoneResidencial;
	}

	public String getTelefoneComercialFormat() {
		if (telefoneComercial != null && !telefoneComercial.equals("")) {
			return StringUtil.format("(##)####-####", telefoneComercial);
		}
		return telefoneComercialFormat;
	}

	public void setTelefoneComercialFormat(String telefoneComercialFormat) {
		this.telefoneComercialFormat = telefoneComercialFormat;
	}

	public String getTelefoneResidencialFormat() {
		if (telefoneResidencial != null && !telefoneResidencial.equals("")) {
			return StringUtil.format("(##)####-####", telefoneResidencial);
		}
		return telefoneResidencialFormat;
	}

	public void setTelefoneResidencialFormat(String telefoneResidencialFormat) {
		this.telefoneResidencialFormat = telefoneResidencialFormat;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public Municipio getMunicipio() {
		return municipio;
	}

	public void setMunicipio(Municipio municipio) {
		this.municipio = municipio;
	}

	public Date getDtnascimento() {
		return dtnascimento;
	}

	public void setDtnascimento(Date dtnascimento) {
		this.dtnascimento = dtnascimento;
	}

	public String getDtnascimentoFormat() {
		if (dtnascimento != null) {
			SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
			return format.format(dtnascimento);
		}
		return dtnascimentoFormat;
	}

	public void setDtnascimentoFormat(String dtnascimentoFormat) {
		try {
			if (dtnascimentoFormat != null && !dtnascimentoFormat.trim().equals("")) {
				SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
				dtnascimento = format.parse(dtnascimentoFormat);
			}
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

		this.dtnascimentoFormat = dtnascimentoFormat;
	}

}
